from io import BytesIO
import base64
import re
from openpyxl import Workbook

def markdown_to_excel_base64(markdown_content: str) -> str:
    """
    将 Markdown 表格内容转换为 Excel 文件，并返回 Base64 编码
    
    参数:
        markdown_content: Markdown 表格内容
        
    返回:
        str: Excel 文件的 Base64 编码
    """
    # 解析 Markdown 表格
    headers, rows = parse_markdown_table(markdown_content)
    
    # 创建 Excel 工作簿
    wb = create_excel_workbook(headers, rows)
    
    # 将工作簿保存到内存中的二进制流
    excel_binary = BytesIO()
    wb.save(excel_binary)
    excel_binary.seek(0)
    binary_data = excel_binary.getvalue()
    
    # 转换为 Base64 编码
    base64_data = base64.b64encode(binary_data).decode('utf-8')
    
    return base64_data

def parse_markdown_table(markdown_content: str) -> tuple:
    """
    解析 Markdown 表格内容，提取表头和数据行
    
    参数:
        markdown_content: Markdown 表格内容
        
    返回:
        tuple: (headers, rows) 表头和数据行
    """
    headers = []
    rows = []
    
    # 按行分割 Markdown 内容
    lines = markdown_content.strip().split('\n')
    
    # 提取表头
    if lines and '|' in lines[0]:
        headers = [cell.strip() for cell in lines[0].split('|')]
        headers = [h for h in headers if h]  # 移除空单元格
    
    # 跳过分隔行 (---|---)
    start_idx = 2 if len(lines) > 1 else 1
    
    # 提取数据行
    for i in range(start_idx, len(lines)):
        if '|' in lines[i]:
            cells = [cell.strip() for cell in lines[i].split('|')]
            cells = [c for c in cells if c != '']  # 移除空单元格
            rows.append(cells)
            
    return headers, rows

def create_excel_workbook(headers: list, rows: list) -> Workbook:
    """
    创建 Excel 工作簿并填充数据
    
    参数:
        headers: 表头列表
        rows: 数据行列表
        
    返回:
        Workbook: 创建好的 Excel 工作簿
    """
    # 创建 Excel 工作簿
    wb = Workbook()
    ws = wb.active
    ws.title = "Markdown转Excel"
    
    # 写入表头
    for col_num, value in enumerate(headers, 1):
        ws.cell(row=1, column=col_num, value=value)
    
    # 处理数据行
    for row_idx, row_data in enumerate(rows, 2):
        for col_idx, cell_value in enumerate(row_data, 1):
            # 检查是否为图片链接
            img_match = re.search(r'!\[(.*?)\]\((.*?)\)', cell_value)
            if img_match:
                img_url = img_match.group(2)
                # 先创建单元格，然后设置超链接
                cell = ws.cell(row=row_idx, column=col_idx, value=f"点击查看图片")
                cell.hyperlink = img_url
            else:
                ws.cell(row=row_idx, column=col_idx, value=cell_value)
    
    # 自动调整列宽
    for col in ws.columns:
        max_length = 0
        for cell in col:
            if cell.value:
                max_length = max(max_length, len(str(cell.value)))
        ws.column_dimensions[col[0].column_letter].width = max(15, max_length + 2)
    
    return wb

# 测试代码
if __name__ == "__main__":
    # 示例 Markdown 表格
    markdown_content = """
    | 姓名 | 年龄 | 职业 |
    | ---- | ---- | ---- |
    | 张三 | 25 | 工程师 |
    | 李四 | 30 | 设计师 |
    | 王五 | 28 | ![图片](https://example.com/image.jpg) |
    """
    
    # 转换为 Excel 并获取 Base64 编码
    base64_data = markdown_to_excel_base64(markdown_content)
    print(f"Excel 文件的 Base64 编码长度: {len(base64_data)}")
    print(f"Base64 编码前20个字符: {base64_data[:20]}...")
    
    # 如果需要保存为文件进行测试
    # with open("output.xlsx", "wb") as f:
    #     f.write(base64.b64decode(base64_data))
    #     print("Excel 文件已保存为 output.xlsx")